# 面向对象(万物皆对象)的三大特征：封装、继承、多态
# 小项目：封装 -> 入口函数main、自定义函数、全局变量
import threading
import urllib3
from bs4 import BeautifulSoup

target_url = 'http://p.weather.com.cn/zrds/index.shtml'
# target_url = 'https://www.ngchina.com.cn/found/travller'

header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}


urls = [] # 存储已经下载过的图片链接的列表
threads = [] # 初始化一个列表用于存储所有的线程对象

# 解析网页数据
def parseData(data):
    count = 0
    soup = BeautifulSoup(data, "lxml")
    images = soup.select("img") # 返回img图片列表
    for img in images:
        try:
            src = img["src"]
            print(src)
            # 下载图片
            if src not in urls:
                # 1. 使用新创建的线程执行下载操作
                # 介绍线程：
                # 举个例子：你在电脑上启动了迅雷下载工具，操作系统会在内存里创建一个空间用于
                # 存储迅雷所有动作产生的数据，它实际上是一个进程（计算机里启动任何一个软件，
                # 操作系统都会为它们创建一个进程（内存空间））；线程是进程的分支，一个进程
                # 一定有一个主线程，进程也可以分出多个线程执行不同的任务，相当于迅雷同时
                # 下载多个文件每一个下载任务都有一个线程来执行
                # 2. 下载的文件名使用序号标注
                count = count + 1
                T = threading.Thread(target=download, args=(src, count))
                T.setDaemon(False)
                T.start()
                threads.append(T)
        except Exception as err:
            print(err)

# 下载图片的操作
def download(url, count):
    try:
        if (url[len(url)-4] == "."):
            ext = url[len(url)-4:]
        else:
            ext = ".png"
        req = urllib3.PoolManager().request('GET',url, headers=header)
        data = req.data
        img_file = open("images\\" + str(count) + ext, "wb")
        img_file.write(data)
        img_file.close()
        print("图片已下载：" + str(count) + ext)
    except Exception as err:
        print(err)

# 请求网页数据
def requestData():
    try:
        # 使用urllib3进行数据请求
        http = urllib3.PoolManager()
        rq = http.request('GET', target_url, headers=header)
        # 查看服务器的响应
        print("获得网页返回的内容：", rq.data.decode('utf-8'))
        return rq.data.decode('utf-8')
    except Exception as err:
        print(err)

if __name__ == '__main__':
    data = requestData()
    parseData(data)

